package br.com.gerenciador_recursos.model;

import java.util.Date;
import java.util.Set;
import java.util.TreeSet;

import br.com.gerenciador_recursos.NoSuchUserException;
import br.com.gerenciador_recursos.service.Timer;
import br.com.gerenciador_recursos.service.UserLocalServiceUtil;

public class Task {

	private int projectId;

	private int taskId;

	private String name;

	private String descricao;

	private Timer estimativa;

	private int userIdExecutor;

	private Date dataInicioPrevisto;

	private Date dataInicioRealizado;

	private Set<Date> timeMarks;
	
	boolean concluido;

	public Task(int taskCode, int projectCode, String name, String description,
			Timer estimativa, int userIdExecutor, Date inicioPrevisto,
			Date inicioRealizado) {
		super();
		this.projectId = projectCode;
		this.taskId = taskCode;
		this.name = name;
		this.descricao = description;
		this.estimativa = estimativa;
		this.userIdExecutor = userIdExecutor;
		this.dataInicioPrevisto = inicioPrevisto;
		this.dataInicioRealizado = inicioRealizado;
		this.concluido = false;
	}

	public boolean isExecution(){
		
		if(concluido || timeMarks == null)
			return false;
		
		return timeMarks.size()%2 == 1;
		
	}
	
	public boolean isConcluido(){
		
		return concluido;
	}
	
	public Status getStatus() {

		if (concluido)
			return Status.CONCLUIDA;
		
		Date now = new Date();
		
		if(dataInicioPrevisto.after(now) && dataInicioRealizado == null)
			return Status.ATRASADA;
			
		
		
		return Status.A_INICIAR;
	}

	public long getProjectId() {
		return projectId;
	}

	public void setProjectId(int projectId) {
		this.projectId = projectId;
	}

	public long getTaskId() {
		return taskId;
	}

	public void setTaskId(int taskId) {
		this.taskId = taskId;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getDescription() {
		return descricao;
	}

	public void setDescription(String description) {
		this.descricao = description;
	}

	public Timer getEstimativa() {
		return estimativa;
	}

	public void setEstimativa(Timer estimativa) {
		this.estimativa = estimativa;
	}

	public User getUserExecutor() throws NoSuchUserException {
		return UserLocalServiceUtil.findByPrimaryKey(userIdExecutor);
	}

	public void setUserId(int userIdExecutor) {
		this.userIdExecutor = userIdExecutor;
	}

	public int getUserIdExecutor() {
		return this.userIdExecutor;
	}

	public Date getDataInicioPrevisto() {
		return dataInicioPrevisto;
	}

	public void setDataInicioPrevisto(Date inicioPrevisto) {
		this.dataInicioPrevisto = inicioPrevisto;
	}

	public Date getDataInicioRealizado() {
		return dataInicioRealizado;
	}

	public void setDataInicioRealizado(Date inicioRealizado) {
		this.dataInicioRealizado = inicioRealizado;
	}


	@Override
	public boolean equals(Object obj) {

		if (obj == null)
			return false;

		if (!(obj instanceof Task))
			return false;

		Task t = (Task) obj;

		return this.getProjectId() == t.getProjectId()
				&& this.getTaskId() == t.getTaskId();
	}

	@Override
	public int hashCode() {

		return projectId * 3 + taskId * 5;
	}

	public void addTimeMark() {
		synchronized (timeMarks) {
			if (timeMarks == null)
				timeMarks = new TreeSet<Date>();
			timeMarks.add(new Date());
		}
	}
	
	public Set<Date> getTimeMarks(){
		
		return timeMarks;
	}
}
